import logging

from django.core.cache import cache
from django.shortcuts import render
from rest_framework.response import Response
from rest_framework.views import APIView

from home.models import NavCategory, CourseCategory, Banner
from home.ser import NavCategorySerializer, CourseCategorySerializer, BannerSerializer

# Create your views here.

logger = logging.getLogger('django')
class NavCategoryAPIView(APIView):
    """
    查询顶部导航分类的接口
    """

    def get(self, request):
        """
        处理GET请求，获取导航分类列表

        Args:
            request: HTTP请求对象

        Returns:
            Response: 包含导航分类数据的响应对象
                - code: 状态码，1表示成功，0表示失败
                - message: 状态消息
                - data: 导航分类数据列表（仅在成功时返回）
        """
        try:
            # 查询未删除且显示的导航分类
            queryset = NavCategory.objects.filter(is_deleted=False, is_show=True)
            ser = NavCategorySerializer(queryset, many=True)
            return Response({
                "code": 1,
                "message": "查询成功",
                "data": ser.data
            })
        except Exception as e:
            # 处理查询异常情况
            return Response({
                "code": 0,
                "message": f"查询失败:{str(e)}"
            })


class CourseCategoryAPIView(APIView):
    """
    查询课程分类的接口
    """
    def get(self,request):
        queryset = CourseCategory.objects.filter(is_deleted=False,is_show=True,level=1)
        ser = CourseCategorySerializer(queryset, many=True)
        logger.info(f"成功获取到课程分类列表,一共{len(ser.data)}记录")
        return Response({
            "code":1,
            "message":"查询成功",
            "data":ser.data
        })
class BannerAPIView(APIView):
    """
    查询轮播图的接口
    """
    def get(self, request):
        """
        处理GET请求，获取轮播图列表

        Args:
            request: HTTP请求对象

        Returns:
            Response: 包含轮播图数据的响应对象
                - code: 状态码，1表示成功，0表示失败
                - message: 返回信息
                - data: 轮播图数据列表
        """
        try:

            # 从Redis缓存中获取轮播图数据
            cache_key = "code_env_spaces:home:banner:list"
            banner_redis = cache.get(cache_key)
            logger.info(f"查询轮播图列表,redis缓存结果为:{banner_redis}")
            if banner_redis:
                logger.info(f"成功从redis获取到轮播图列表,一共{len(banner_redis)}记录")
                return Response({
                    "code":1,
                    "message":"查询成功",
                    "data":banner_redis
                })


            # 缓存未命中，从数据库查询轮播图数据
            queryset = Banner.objects.filter(is_deleted=False,is_show=True)
            ser = BannerSerializer(queryset, many=True)

            logger.info(f"成功从mysql获取到轮播图列表,一共{len(ser.data)}记录")
            # 将查询结果存入Redis缓存，有效期24小时
            # 如果查询结果为空，也缓存空结果一段时间，避免缓存穿透
            cache_timeout = 60 * 60 * 24 if ser.data else 60 * 5  # 空结果缓存5分钟
            cache.set(cache_key, ser.data if ser.data else [], timeout=cache_timeout)

            return Response({
                "code":1,
                "message":"查询成功",
                "data":ser.data
            })
        except Exception as e:
            logger.error(f"查询轮播图列表失败:{str(e)}")
            return Response({
                "code":0,
                "message":f"查询失败:{str(e)}"
            })

